/**
 * ajax请求
 * @param {Object} Vue Vue的实例
 * @param {Object} options 请求配置公用
 * @return {Function} 返回当前@ajax promise 对象
 */

 import { REQUEST_SUCCESS_CODE, SERVICE_URL, REQUEST_ERROR_CODE } from './config.js'
import axios from 'axios'
export default {
	install(Vue, options) {
		// 默认参数
		const DEFAULT_CONFIG = {
			// 接口名称
			api: '',
			// 默认POST请求
			type: 'POST',
			// 请求参数
			params: {},
		}
		Vue.prototype.$ajax = ((option) => {
			// 拼接参数

			let resData = Object.assign({}, DEFAULT_CONFIG, option)

			/**
			* get 请求需要拼接 参数 url + params
			* export 导入和导出需要传的参数
			*/
			let url = resData.type == 'GET' ? `${SERVICE_URL}${option.api}${mergeUrl(resData)}` :`${SERVICE_URL}${option.api}`

			/**
			 * file 如果是上传图片 参数必须是file
			 * contentType 存在表示需要传递后端的格式是 JSON格式
			 */
			let contentType = 'multipart/form-data'
			return new Promise((resolve, reject) => {
				axios({
					url: url,
					data: resData.params,
					method: resData.type,
					transformRequest: [(data) => {
						// 如果当前是get请求
						let ret = ''
						if (resData.type == 'GET') {
							for (let it in resData.params) {
								ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
							}
						} else {
							/**
							 * @desc 处理请求参数
							 * resData.params.file 处理上传类型的请求
							 */
							ret = resData.params.file  ? resData.params.file : resData.contentType ? JSON.stringify(resData
								.params) : handleParams(resData.params)
						}
						return ret
					}],
					headers: {
						'Content-Type': contentType
					}
				}).then(res => {
					resolve({
            data: res.data,
            code: REQUEST_SUCCESS_CODE
          })
				}).catch(err => {
					console.log(err)
					reject({
            message: '服务器报错',
            code: REQUEST_ERROR_CODE
					})
				})
			})
		})
	}
}

/**
 * 	@author yang
 *	@param param 请求的参数
 * 	@return 返回拼接后的参url参数
 */
const mergeUrl = (options) => {
	let url = ''
	for (let k in options.params) {
		let value = options.params[k] !== undefined ? options.params[k] : ''
		url += '&' + k + '=' + encodeURIComponent(value)
	}
	return url ? '?'+url.substring(1) : ''
}

/**
 * @author yang
 * @param param 请求的参数
 * @return 返回拼接后的参数
 */
const handleParams = (param) => {
	let params = []
	let result = null
	let keys = Object.keys(param)
	for (let i = 0, len = keys.length; i < len; i++) {
		// 去除空参数
		if (param[keys[i]] !== undefined && param[keys[i]] !== null) {
			param[keys[i]] = encodeURIComponent(param[keys[i]])
			params.push(keys[i] + '=' + param[keys[i]])
		}
	}
	result = params.join('&')
	return result
}
